package ytmc.converter;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import ytmc.FileUtils;
import ytmc.setup.AudioFormat;
import ytmc.setup.VideoFormat;


/**
 *
 * @author Kicok
 */
public class ConversionTaskValidator
{
    private ConversionTask task;

    public ConversionTaskValidator( ConversionTask task )
    {
        this.task = task;
    }

    public void validate() throws Exception
    {
        validateInputFileExistance();
        validateOutputFileExistance();
        validateFileExtensions();
    }


    private void validateInputFileExistance() throws IOException
    {
        if( !task.getInputFile().exists() || !task.getInputFile().isFile() )
        {
            throw new IOException( "Plik wejściowy nie istnieje" );
        }
        if( !task.getInputFile().canRead() )
        {
            throw new IOException( "Nie można czytać z pliku wejściowego" );
        }
    }

    private void validateOutputFileExistance() throws IOException
    {
        if( task.getOutputFile().exists() && task.getOutputFile().isFile() )
        {
            if( !task.getOutputFile().delete() )
            {
                throw new IOException( "Plik wyjściowy już istnieje i nie można go usunąć" );
            }
        }
    }

    private void validateFileExtensions() throws Exception
    {
        List<String> videoExtensions = Arrays.asList( VideoFormat.friendlyNames() );
        List<String> audioExtensions = Arrays.asList( AudioFormat.friendlyNames() );

        String inputExtension = FileUtils.getExtension( task.getInputFile() ).toLowerCase();
        String outputExtension = FileUtils.getExtension( task.getOutputFile() ).toLowerCase();

        if( !videoExtensions.contains( inputExtension ) )
        {
            throw new IOException( "Nieprawidłowe rozszerzenie pliku wejściowego" );
        }

        if( videoExtensions.contains( outputExtension ) )
        {
            if( task.getType() != ConversionType.VIDEO )
            {
                throw new Exception( "Rozszerzenie pliku wyjściowego nie pasuje do rodzaju konwersji" );
            }
        }
        else if( audioExtensions.contains( outputExtension ) )
        {
            if( task.getType() != ConversionType.AUDIO )
            {
                throw new Exception( "Rozszerzenie pliku wyjściowego nie pasuje do rodzaju konwersji" );
            }
        }
        else
        {
            throw new IOException( "Nieprawidłowe rozszerzenie pliku wyjściowego" );
        }
    }
}